<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>02_ES6(Set,map)</title>
	</head>
	<body>
	</body>
</html>
<script type="text/javascript">
	/*
	1. set定义及特征
	在js中Set对象允许存储任何类型的唯一值，无论是原始值或者是对象引用。
	顶层数据结构不具备key->vakue 特征，内部会自动加index序列
	可以存储不同类型的任何数据
	
	如何理解唯一性：对于原始数据类型（Boolean，number，string，null，undefined）如果存储相同值则只会保存一个，对于引用类型做“===”判断即引用地址完全相同则只会存一个。
	   let set = new Set();  
	//a,b属于object 值完全相同
	    let a = {
	        name:"cc",
	        age:28
	    };
	    let b = {
	        name:"cc",
	        age:28
	    };
	   
	//c,d属于number类型 值完全相同
	    let c = 0,d = 0;
	//e,f 属于Date类型，值相同
	    let e=f = new Date();
	
	    set.add(a);
	    set.add(b);
	    set.add(c);
	    set.add(d);
	    set.add(e);
	    set.add(f);
	
	    a= "abc";
	    b = {
	        name:"cc",
	        age:30
	    }
	    set.add(a);
	    set.add(b);
	    console.log(set);
	
	
	set 方法
	使用场景，数组去重，交集，并集，差集等操作
	
		size属性: 返回集合的元素个数。（类似数组的长度length）
		add(value)方法: 向集合中添加一个元素value。注意：如果向集合中添加一个已经存在的元素，不报错但是集合不会改变。
		delete(value)方法: 从集合中删除元素value。
		has(value)方法: 判断value是否在集合中，返回true或false.
		clear()方法: 清空集合。
	
	
	2.map
		
	map定义及特征
		Map 对象保存键值对，任何值（对象或者原始值）都可以作为一个键或一个值
	Map 常用属性及增删改差方法：
		size: 属性，取出字典的长度
		set(key, value)：方法，向字典中添加新元素
		get(key)：方法，通过键查找特定的数值并返回
		has(key)：方法，判断字典中是否存在键key
		delete(key)：方法，通过键 key 从字典中移除对应的数据
		clear()：方法，将这个字典中的所有元素删除
	
	
	3.WeakSet
	
	和Set结构类似，也是不重复的值的集合，但是WeakSet的成员只能是对象
	
	WeakSet的API：add()增 delete()删除 has()是否存在
	
	注意：ws没有size属性，不可遍历。因为WeakSet的成员都是弱引用，随时可能消失，成员是不稳定的
	用处：
		1.使用weakSet存储DOM节点，就不用担心节点从文档移除时，会引发内存泄漏（即在被移除的节点上绑定的click事件）
		2.	方法对实例的引用，不会被计入内存回收机制，所以删除实例的时候，不用考虑方法，也不会出现内存泄漏。
		
	4.WeakMap
	WeakMap与Map的区别：
		WeakMap对象是一组键值对的集合，其中的键是弱引用对象，而值可以是任意。
		注意：WeakMap弱引用的只是键名，而不是键值。键值依然是正常引用的。
	WeakMap 中，每个键对自己所引用对象的引用都是弱引用，在没有其他引用和该键引用同一对象，这个对象将会被垃圾回收（相应的key则变成无效的），所以，WeakMap 的 key 是不可枚举的。
	*/
</script>
